/**
 *Copyright (c) 2024 watereyes
 * workflow is licensed under Mulan PubL v2.
 * You can use this software according to the terms and conditions of the Mulan
 * PubL v2.
 * You may obtain a copy of Mulan PubL v2 at:
 *          http://license.coscl.org.cn/MulanPubL-2.0
 * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
 * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
 * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
 * See the Mulan PubL v2 for more details.
 */
package com.koron.workflow.api.service.impl;

import java.util.Arrays;
import java.util.List;

import org.activiti.engine.task.Task;
import org.koron.ebs.mybatis.ADOConnection;
import org.koron.ebs.mybatis.SessionFactory;
import org.koron.ebs.mybatis.SqlTask;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import com.koron.workflow.api.bean.TimerBean;
import com.koron.workflow.api.mapper.TimerMapper;
import com.koron.workflow.api.service.ActivitiService;
import com.koron.workflow.api.service.AutoCompleteService;
import com.koron.workflow.api.service.DelayExecutor;
import com.koron.workflow.common.util.SpringContextHolder;

@Component
public class AutoCompleteServiceImpl implements AutoCompleteService, Runnable{

	private static Logger log = LoggerFactory.getLogger(AutoCompleteServiceImpl.class);

	private ActivitiService activitiService = SpringContextHolder.getBean(ActivitiService.class);

	private TimerBean timer;
	
	public AutoCompleteServiceImpl() {
		
	}
	
	public AutoCompleteServiceImpl(TimerBean timer) {
		this.timer = timer;
	}
	
	@Override
	@Scheduled(cron = "0 */1 * * * ?")
	public void complete() {
		ADOConnection.runTask(new SqlTask() {
			@Override
			public Object run(SessionFactory factory) {
				TimerMapper mapper = factory.getMapper(TimerMapper.class);
				List<TimerBean> timers = mapper.findAllByType(Arrays.asList(4, 8, 16));
				for(TimerBean timer : timers) {
					DelayExecutor.join(timer);
				}
				return null;
			}
		}, Void.class);
	}

	private void complete0(TimerBean bean) {
		if (bean == null || bean.getStatus() == 2) {
			return;
		}
		Task task = activitiService.getTaskById(bean.getTaskId());
		if (task == null) {
			return;
		}
		ADOConnection.runTask(new SqlTask() {
			@Override
			public Object run(SessionFactory factory) {
				// 催办处理人
				if (bean.getType() == TYPE_URGEHANDLER) {

				}
				// 过期自动跳过
				if (bean.getType() == TYPE_AUTOSKIP) {

				}
				// 通知起草人
				if (bean.getType() == TYPE_NOTICEDRAFTMAN) {

				}
				return null;
			}
		}, Void.class);
	}

	@Override
	public void run() {
		log.debug("开始执行.............");
		complete0(timer);
		log.debug("结束执行.............");
	}
	
}
